#include <cstdio>
#include <algorithm>
using namespace std;
const int N=2e5+50;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
typedef long long ll;
ll n,k;
ll a[N];
//存储下一个非1的位置
int vis[N];
ll ans;
//判断两个数相乘是否溢出long long
bool Overflow(ll x,ll y){
    if(x>__LONG_LONG_MAX__/y){
        return false;
    }
    else{
        return true;
    }
}
int main(void){
    freopen("data.txt","r",stdin);
    //6 1 1 3 1 3 8 1
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    //vis[i]标记i位置下一个非1的数的位置
    //如果当前数是1,则vis[i]=vis[i+1] 否则vis[i]=i
    vis[n+1]=-1;
    for(int i=n;i>=1;i--){
        if(a[i]>1){
            vis[i]=i;
        }
        else{
            vis[i]=vis[i+1];
        }
    }
    for(int i=1;i<=n;i++){
        printf("%d ",vis[i]);
    }
    printf("\n");
    ll p=1;
    ll s=0;
    //枚举区间左端点 
    for(int i=1;i<=n;i++){
        int j=i;
        //初始化区间积和区间和
        p=a[i];
        s=a[i];
        //满足条件
        if(p==s*k){
            ans++;
        }
        while(true){
            //从下个位置开始找第一个非1的数
            int z=vis[j+1];
            //找不到，则右端点为n+1 
            if(z==-1){
                z=n+1;
            }
            //区间（不含右端点）内1的个数
            int ones=z-j-1;
            //可以减去几个1使满足条件 1的个数要在ones以内
            if(p%k==0 && p/k-s>=1 && p/k-s<=ones){
                ans++;
            }
            if(z==n+1){
                break;
            }
            //判断当前积乘以右端点值是否溢出
            if(Overflow(p,a[z])){
                p=p*a[z];
                j=z;
                s=s+a[z]+ones;
                if(p==s*k){
                    ans++;
                }
            }
            else{
                break;
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}